
package com.sadam.ui4.Utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ValidationUtils {

    private static final List<String> SENSITIVE_WORDS = Arrays.asList(
            "admin", "root", "system", "null", "administrator", "guest", "user"
    );

    public static final int USERNAME_MIN_LENGTH = 3;
    public static final int USERNAME_MAX_LENGTH = 20;
    public static final int PASSWORD_MIN_LENGTH = 6;
    public static final int PASSWORD_MAX_LENGTH = 20;

    /**
     * 批量验证注册信息，返回所有错误信息列表
     * @param username 用户名
     * @param password 密码
     * @param confirmPassword 确认密码
     * @return 错误信息列表
     */
    public static List<String> validateRegistration(String username, String password, String confirmPassword) {
        List<String> errors = new ArrayList<>();

        // ========== 用户名校验 ==========
        if (username == null || username.trim().isEmpty()) {
            errors.add("用户名不能为空");
        } else {
            username = username.trim();

            if (username.length() < USERNAME_MIN_LENGTH) {
                errors.add("用户名不能少于 " + USERNAME_MIN_LENGTH + " 位");
            }
            if (username.length() > USERNAME_MAX_LENGTH) {
                errors.add("用户名不能超过 " + USERNAME_MAX_LENGTH + " 位");
            }
            if (username.contains(" ")) {
                errors.add("用户名不能包含空格");
            }
            if (containsChinese(username)) {
                errors.add("用户名不能包含中文");
            }
            if (!username.matches("^[a-zA-Z0-9_\\-.]+$")) {
                errors.add("用户名只能包含字母、数字、下划线(_)、短横线(-)、点(.)");
            }
            if (SENSITIVE_WORDS.contains(username.toLowerCase())) {
                errors.add("该用户名为保留字，不可使用");
            }
        }

        // ========== 密码校验 ==========
        if (password == null || password.trim().isEmpty()) {
            errors.add("密码不能为空");
        } else {
            password = password.trim();

            if (password.length() < PASSWORD_MIN_LENGTH) {
                errors.add("密码不能少于 " + PASSWORD_MIN_LENGTH + " 位");
            }
            if (password.length() > PASSWORD_MAX_LENGTH) {
                errors.add("密码不能超过 " + PASSWORD_MAX_LENGTH + " 位");
            }

            // 密码不能与用户名相同（仅当用户名有效时）
            if (username != null && !username.trim().isEmpty() && password.equalsIgnoreCase(username.trim())) {
                errors.add("密码不能与用户名相同");
            }

            // 检查密码复杂度：大写、小写、数字 至少包含三类
            boolean hasUpper = false, hasLower = false, hasDigit = false;
            for (char c : password.toCharArray()) {
                if (c >= 'A' && c <= 'Z') hasUpper = true;
                else if (c >= 'a' && c <= 'z') hasLower = true;
                else if (c >= '0' && c <= '9') hasDigit = true;
            }
            int categoryCount = (hasUpper ? 1 : 0) + (hasLower ? 1 : 0) + (hasDigit ? 1 : 0);
            if (categoryCount < 3) {
                errors.add("密码需包含大写字母、小写字母、数字中的至少三类");
            }
        }

        // ========== 确认密码校验 ==========
        if (confirmPassword == null || confirmPassword.trim().isEmpty()) {
            errors.add("请再次输入密码以确认");
        } else {
            confirmPassword = confirmPassword.trim();

            // 只有当 password 非空时才比较
            if (password != null && !password.isEmpty() && !password.equals(confirmPassword)) {
                errors.add("两次输入的密码不一致");
            }
        }

        return errors;
    }

    private static boolean containsChinese(String str) {
        if (str == null) return false;
        for (char c : str.toCharArray()) {
            if (c >= 0x4E00 && c <= 0x9FFF) {
                return true;
            }
        }
        return false;
    }

    /**
     * 仅校验密码强度（用于修改密码等场景）
     * @param password 密码
     * @param username 关联的用户名（可选，用于比较）
     * @return 错误信息列表
     */
    public static List<String> validatePassword(String password, String username) {
        List<String> errors = new ArrayList<>();

        if (password == null || password.trim().isEmpty()) {
            errors.add("密码不能为空");
            return errors;
        }

        password = password.trim();

        if (password.length() < PASSWORD_MIN_LENGTH) {
            errors.add("密码不能少于 " + PASSWORD_MIN_LENGTH + " 位");
        }
        if (password.length() > PASSWORD_MAX_LENGTH) {
            errors.add("密码不能超过 " + PASSWORD_MAX_LENGTH + " 位");
        }

        if (username != null && !username.trim().isEmpty() && password.equalsIgnoreCase(username.trim())) {
            errors.add("密码不能与用户名相同");
        }

        boolean hasUpper = false, hasLower = false, hasDigit = false;
        for (char c : password.toCharArray()) {
            if (c >= 'A' && c <= 'Z') hasUpper = true;
            else if (c >= 'a' && c <= 'z') hasLower = true;
            else if (c >= '0' && c <= '9') hasDigit = true;
        }
        int categoryCount = (hasUpper ? 1 : 0) + (hasLower ? 1 : 0) + (hasDigit ? 1 : 0);
        if (categoryCount < 3) {
            errors.add("密码需包含大写字母、小写字母、数字中的至少三类");
        }

        return errors;
    }
    /**
     * 仅校验用户名格式（用于修改用户名等场景）
     */
    public static List<String> validateUsername(String username) {
        List<String> errors = new ArrayList<>();

        if (username == null || username.trim().isEmpty()) {
            errors.add("用户名不能为空");
            return errors;
        }

        username = username.trim();

        if (username.length() < USERNAME_MIN_LENGTH) {
            errors.add("用户名不能少于 " + USERNAME_MIN_LENGTH + " 位");
        }
        if (username.length() > USERNAME_MAX_LENGTH) {
            errors.add("用户名不能超过 " + USERNAME_MAX_LENGTH + " 位");
        }
        if (username.contains(" ")) {
            errors.add("用户名不能包含空格");
        }
        if (containsChinese(username)) {
            errors.add("用户名不能包含中文");
        }
        if (!username.matches("^[a-zA-Z0-9_\\-.]+$")) {
            errors.add("用户名只能包含字母、数字、下划线(_)、短横线(-)、点(.)");
        }
        if (SENSITIVE_WORDS.contains(username.toLowerCase())) {
            errors.add("该用户名为保留字，不可使用");
        }

        return errors;
    }
}